iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0

今天主要會講的部分有

  • Slice
  • Struct

Slice

Slice類型通常翻譯為切片,它表示從某個包含多個元素的容器中取得局部數據,這個過程稱為切片操作。不同語言對切片的支持有所不同,比如有些語言只允許取得連續的局部元素,而有些語言可以取得離散元素,甚至有些語言可以對hash結構進行切片操作。

Rust也支持Slice操作,Rust中的切片操作只允許獲取一段連續的局部數據,切片操作獲取到的數據稱為切片數據

可以想像成開了一個小視窗來查看原本的資料,

slice的操作主要如下

  • s[n1..n2]:獲取s中index=n1到index=n2(不包括n2)之間的所有元素
  • s[n1..]:獲取s中index=n1到最後一個元素之間的所有元素
  • s[..n2]:獲取s中第一個元素到index=n2(不包括n2)之間的所有元素
  • s[..]:獲取s中所有元素

但由於切片數據的長度無法在編譯期間得到確認,且編譯器是不允許使用大小不定的數據類型的,因此無法直接去使用切片數據。

所以在Rust中幾乎總是使用切片數據的引用。切片數據的引用對應的數據類型描述為&[T]&mut [T],前者不可通過Slice引用來修改源數據,後者可修改源數據。

範例如下

let points = [6, 10, 12, 19, 23, 45];
let slice1 = &points[0..3]; //不可變
let slice2 = &mut points[4..6]; //可變

此外,因為 slice 本身就是引用,所以可以直接將array的引用當成slice來使用。即&arr&mut arr當作不可變slice和可變slice來使用。

切片本身也有型別,切片的型別就是它所參照到的資料的型別.

範例如下

fn calc_point(points: &[u16]) -> u16 {
    points.iter().sum()
}

let points = [6, 10, 12, 19, 23, 45];
let group1 = &points[0..2];
let group2 = &points[2..];

println!("{}", calc_point(group1));
println!("{}", calc_point(group2));

可以看到 &[u16] 表示傳進來的參數是個陣列型的切片,前面的 & 表示它是一種參照型別,裡面的 u16 則是表示原先陣列裡的型別

底下這裡是一些 slice 常見的 attribute

  • len():取slice元素個數
  • is_empty():判斷slice是否為空
  • contains():判斷是否包含某個元素
  • repeat():重複slice指定次數
  • reverse():反轉slice
  • join():將各元素壓平(flatten)並通過指定的分隔符連接起來
  • swap():交換兩個索引處的元素,如s.swap(1,3)
  • windows():以指定大小的窗口進行滾動迭代
  • starts_with():判斷slice是否以某個slice開頭

Struct

在 Rust 裡可以使用 struct 關鍵字來定義一個 Sturct:

struct Order {
    bid: u8,
    ask: u8,
    is_buy: bool,
}

定義完之後,就可以用這個sturct來建立東西

let order = Order {
    bid: 34,
    ask: 35,
    is_buy: true,
};

透過 . 就可以取用設定的值了

println!("{}", order.bid);
println!("{}", order.ask);
println!("{}", order.is_buy);

接著,和其他語言比較不一樣的地方在於定義方法不會寫在類別裡,而是透過透過 impl 關鍵字寫在別的地方.

如下

let order = Order {
    bid: 34,
    ask: 35,
    is_buy: true,
};

impl Order {
    fn cal_spread(&self) {
        println!("Hello, my name is {}", self.ask - self.bid);
    }
    fn set_dir(&mut self, is_buy: bool) { // 這樣才可以修改值
        self.is_buy = is_buy;
    }
}

今天就先講到這,明天會繼續介紹 Lifttime 跟 Trait,這幾天的東西會比較基本,但Rust本身限制較多,所以這些基本觀念要先掌握,才不會之後瘋狂的在處理編譯錯誤


上一篇
【Day6】- Rust(Concepts, Ownership)
下一篇
【Day8】- Rust(Lifetime, Trait)
系列文
NautilusTrader 架構解析:Rust 在高效能量化交易平台中的角色與優勢22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言